// console.log('global:',global)
console.log('global:',Object.keys(global));
// console.log('global:',Object.keys(global).length); //21 //每个nodejs版本有差别的
/*
global: [ 'DTRACE_NET_SERVER_CONNECTION',
  'DTRACE_NET_STREAM_END',
  'DTRACE_HTTP_SERVER_REQUEST',
  'DTRACE_HTTP_SERVER_RESPONSE',
  'DTRACE_HTTP_CLIENT_REQUEST',
  'DTRACE_HTTP_CLIENT_RESPONSE',
  'COUNTER_NET_SERVER_CONNECTION',
  'COUNTER_NET_SERVER_CONNECTION_CLOSE',
  'COUNTER_HTTP_SERVER_REQUEST',
  'COUNTER_HTTP_SERVER_RESPONSE',
  'COUNTER_HTTP_CLIENT_REQUEST',
  'COUNTER_HTTP_CLIENT_RESPONSE',
  'global', // ← 循环引用 类似于浏览器端的 window.window
  'process',
  'Buffer',
  'clearImmediate',
  'clearInterval',
  'clearTimeout',
  'setImmediate',
  'setInterval',
  'setTimeout' ]
*/


/** 等同于global，和浏览器端的window.window一样，都是自己可以引用自己*/
// console.log('global.global:',global.global);


/** 这里面就有ecma里的那些模块*/
// console.dir(global, {showHidden: true});


/** 进程*/
// console.log('process:',process);
// console.log('global.process === process',global.process === process); //true


/** node中为了实现读写二进制文件，制定的数据格式(16进制)*/
// console.log('Buffer', Buffer);

/** 注意区分global上的属性 和 我们模块包裹器函数传进来的参数属性*/
//exports、module、__dirname、__filename 是模块包裹器传进来的参数属性
//
//process、Buffer这些是global上的全局属性

/** {} 我们文件在执行的时候为了实现模块化 (文件)外面特意套了一个函数 而且this指向被改变了(并不是指向global，而是指向module.exports)*/
// console.log(this);

/** 自执行函数(闭包函数)里的this永远指向的是我们的global, 全局下打this指向的是module.exports*/
/*(function () {
  console.log(this) //指向global
})();*/

/** 一般不要在全局上挂东西（污染）
 *  但可以用于全局配置、数据库连接*/
global.a = 100;
//↑ 这样所有模块都能拿到a
// var a = 101;
//↑ 这样是放在模块函数中声明的
console.log(a); //101
//↑ 这样打印是取的模块函数中的a 而不是全局的a
//  但如果模块函数中没有声明, 则能取到全局中的a(就近原则)
console.log(global.a); //100
